package com.andnnl.pool.user;

import com.andnnl.pool.IUser;

import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;

/**
 * 公共的属性
 * Created by chenss on 2022/6/10.
 */
public abstract class AbsUser<T> implements IUser<T> {
    protected String name;
    protected int batchSize = 1;//每次取多少个
    protected boolean isPause = false;//是否暂停处理这个用户的数据
    private final AtomicBoolean inQueue = new AtomicBoolean(false);
    protected long currTime = System.currentTimeMillis();
    protected AtomicInteger dataSize=new AtomicInteger();


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getBatchSize() {
        return batchSize;
    }

    public void setBatchSize(int batchSize) {
        this.batchSize = batchSize;
    }

    public AtomicBoolean getInQueue() {
        return inQueue;
    }

    protected Consumer<IUser<T>> resumeCallBack = (user) -> {
    };

    /**
     * 重置当前时间
     * 每用一次都要重置
     */
    @Override
    public void resetCurrTime() {
        this.currTime = System.currentTimeMillis();
    }

    /**
     * 获取当前时间
     *
     * @return
     */
    @Override
    public long getCurrTime() {
        return currTime;
    }

    /**
     * 是否忽略处理当前用户的数据
     *
     * @return
     */
    @Override
    public boolean isPause() {
        return this.isPause;
    }

    /**
     * 是否忽略处理当前用户的数据
     */
    @Override
    public void pause() {
        this.isPause = true;
    }

    /**
     * 恢复执行的方法。
     * 该方法将暂停状态设置为false，并且会调用resumeCallBack中注册的接受者。
     */
    @Override
    public void resume() {
        this.isPause = false; // 将当前对象的暂停状态设置为false
        resumeCallBack.accept(this); // 调用注册的恢复回调函数
    }


    /**
     * 设置恢复回调函数，当恢复时，重新把用户加入队列
     *
     * @param resumeCallBack
     */
    public void setResumeCallBack(Consumer<IUser<T>> resumeCallBack) {
        this.resumeCallBack = resumeCallBack;
    }

    /**
     * 统计队列中，所有的msg.dataSize
     *
     * @return
     */
    @Override
    public int getTotalDataSize() {
        return dataSize.get();
    }
}
